﻿namespace Reading.ViewModels
{
    using System;
    using System.Windows.Controls;
    using System.Windows.Markup;

    public class Article : System.ComponentModel.INotifyPropertyChanged
    {
        public Article() { Published = DateTime.Now; }

        string id;
        public string Id
        {
            get { return id; }
            set
            {
                if (id != value)
                {
                    id = value;
                    NotifyPropertyChanged("Id");
                }
            }
        }

        string title;
        public string Title
        {
            get { return title; }
            set
            {
                if (title != value)
                {
                    title = value;
                    NotifyPropertyChanged("Title");
                }
            }
        }

        StackPanel content;
        public StackPanel Content
        {
            get { return content; }
            set
            {
                if (content != value)
                {
                    content = value;
                    NotifyPropertyChanged("Content");
                }
            }
        }

        string origin;
        public string Origin
        {
            get { return origin; }
            set
            {
                if (origin != value)
                {
                    origin = value;
                    NotifyPropertyChanged("Origin");
                }
            }
        }

        DateTime published;
        public DateTime Published
        {
            get { return published; }
            set
            {
                if (published != value)
                {
                    published = value;
                    NotifyPropertyChanged("Published");
                }
            }
        }

        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        void NotifyPropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }

    public class ReadingContext : System.ComponentModel.INotifyPropertyChanged
    {
        public ReadingContext()
        {
            articles = new System.Collections.ObjectModel.ObservableCollection<Article>();

            for (int i = 0; i < 30; i++)
            {
                articles.Add(NewArticle(string.Format("- {0} - news for test", i), "IT news"));
            }
        }

        System.Collections.ObjectModel.ObservableCollection<Article> articles;
        public System.Collections.ObjectModel.ObservableCollection<Article> Articles
        {
            get { return articles; }
            set
            {
                if (articles != value)
                {
                    articles = value;
                    NotifyPropertyChanged("Articles");
                }
            }
        }

        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        void NotifyPropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }

        static Article NewArticle(string title, string origin)
        {
            Article a = new Article();
            a.Title = title;
            a.Id = Guid.NewGuid().ToString();
            a.Origin = origin;
            var content = @"<RichTextBox FontSize=""24""><Paragraph>作者/顽石互动 CEO @吴刚</Paragraph>
<Paragraph>　　很遗憾，2012年底的时候，一个个属于创新和个人开发者的平台都要沦陷了……</Paragraph>
<Paragraph>　　无法说这是件坏事，但也的确不是啥好事。一个朋友昨天跟我说，昨天他们做刷榜的各公司一起开了个内部碰头会，为了不彼此恶性竞争，众人将榜单瓜分了，实在争不下来，就一三五、二四六。<Bold>只一年，从刷榜冒头，到众人皆刷，到不刷不行，再到刷到成本爆，市场变化之快，进化的像流感细菌似的。我们其实都明白，这样的演变是无法阻挡的。我们既是受害者，同时也是始作俑者。</Bold>好像我们很多城市的十字路口，没了红绿灯，人人都想急着过去，最后人人也都过不去。很多时候，小公司认为没底线是小公司赖以生存的法宝，其实呢，没底线着实是大公司的保护伞，在彼此都没有底线的情况下，大公司的地位得到了稳固，小公司自相残杀充当了炮灰。</Paragraph>
<Paragraph>　　<Bold>让我们看看现实吧：</Bold></Paragraph>
<Paragraph>　　曾几何时，各 STORE 各 APP 商城是鼓励创新支持个人开发者的平台，无论你的产品如何“各色”、如何小众，就算是免费的，你不打算赚钱，但总有你的簇拥，新产品拥有了曝光量，有了基础的曝光量，有了这些种子，总能让你慢慢爬上去。可现在新产品曝光量为0。开发者不得不去做自己不擅长的事情：做广告、做宣传。很可惜，广告宣传的渠道很多也不纯粹了，为了能获得更高的广告投放，甚至开始做不属于媒体的事儿，很糟糕的事儿(不展开了)。本来媒体角度是独特性的，广告投放者可以根据媒体受众进行不同投放，但媒体的急功近利，导致媒体也趋同了，媒体要自己变成渠道，联运、分成大行其道、大家都向“钱”看。最终，小众产品没有曝光量、没有收入当然也负担不起广告费或者高额的分成，形成恶性循环，淹没在 APP 几十万个应用大军之中。</Paragraph>
<Paragraph>　　那是不是有收入的 APP 游戏就好些呢?我们再来看看有收入的 APP 游戏。</Paragraph>
<Paragraph>　　考量 APP 的游戏最关键的指标目前就是收入!除了收入还是收入。在当前市场，别说什么好产品或者好玩之类的专业词儿，因为那些都不可以被量化，而只有收入可以量化。渠道给了你量，你就要把量变成钱，在渠道眼睛里，没有产品好不好，只有收入多不多。300就比 200 好，200就比 100 好，既然我可以把流量导入到一个可以赚 300 的产品里，为什么要导入到 200 的产品里呢?于是每一块收入，都是 APP 游戏与其他产品竞争的关键。所以有收入，收入不够高，也不行!</Paragraph>
<Paragraph>　　做渠道的人也不容易。现在很多渠道都逐渐采取了一种分离模式：运营部门与流量部门分开，运营部门要向流量部门内部购买流量，当然，运营部门也就成为了另外一种形式的广告部，它的流量也有了成本，这样的核算机制，自然压力会转嫁到所运营的产品身上。</Paragraph>
<Paragraph>　　别急，做收入也不是只有收入那么简单，它还有个前后的问题，早晚的问题。一个渠道帮你产品上线之后，会紧盯你的收入数据。渠道可没有耐心盯着你几个月。第一天给你导个几千的量，第二天就看你留存、就看你的付费率。几个星期下来，如果各项指标不达标，自然不会再给你流量。客观上，形成了 APP 游戏开发者必须要设计一种，首周就形成付费率、ARPU 的产品，各项指标不高还都不行，谁有那个耐心给你灌上几个月用户，然后再看收入啊。大家说的首周定生死，也就是这么个原因。刷榜也是这么回事，刷来刷去最后还是要拼 ARPU，当然给投资人看是另外一个故事。</Paragraph>
<Paragraph>　　当然，渠道的帐，算的也是合理的，假设一个下载用户人家通过广告模式卖，卖你两块钱一个，卖你一百个拿到 200 块，那么人家把这些用户导入到你游戏，就要比 200 赚得多。假设，你的付费率是2%，两个付费用户，就要每个人扛 100 元的收入。稍等等，你还没算分成，假设你与渠道是5：5分成，那就要每个付费玩家扛 200 元收入，这只是刚打平。那么2% 的付费率，300块的月 ARPU 也就是个及格水平。</Paragraph>
</RichTextBox><RichTextBox FontSize=""24""><Paragraph>　　如果你一直搞不懂为什么有些 APP 游戏不做 android 联运，不做 android 渠道，很简单，在 APPSTORE 刷榜获得单一用户的成本要比 android 与联运的成本低，在 android 联运渠道，你做不了假，分不出来钱，没人跟你联运，更没有榜能刷。</Paragraph>
<Paragraph>　　综上所述，开发者的 APP 游戏趋同了：计费!高 ARPU!前置付费点。刚才朋友说，<Bold>页游的今天就是手游的明天，没错!只会速度更快!</Bold></Paragraph>
<Paragraph>　　<Bold>最后，大概说几个事实：</Bold></Paragraph>
<Paragraph>　　<Bold>1、刷榜是会越刷越贵的，位置就那么几个，猪八戒啃猪蹄的模式自己长不壮。今天你付出的成本，就是明天消灭你的子弹，这是个零和游戏。</Bold></Paragraph>
<Paragraph>　　<Bold>2、渠道过早的强调收入，会把自己压缩到更小的空间失去成长性。从而让 QQ 这些渠道越做越大，他们才是你的催命鬼!流量!流量!还是流量!不是收入!收入!还是收入!</Bold></Paragraph>
<Paragraph>　　<Bold>3、渠道的运营产品需要多样性，同质化产品会使用户疲惫，收入递减。</Bold></Paragraph>
<Paragraph>　　<Bold>4、媒体失去独特性和角度就不是媒体。媒体做好媒体的事儿，投放广告买的可不是刷榜的量。媒体的权威形成需要的是时间!</Bold></Paragraph>
<Paragraph>　　<Bold>5、APP 开发商的 2013，难度只是刚刚开始。想办法找到自己的核心竞争力!</Bold></Paragraph>
<Paragraph>　　<Bold>APP 游戏的运营与谈恋爱不同，恋爱讲求的是：就算全世界都不喜欢你，但只要有一个你喜欢的人喜欢你，那就是最好的。</Bold></Paragraph>
<Paragraph>　　年底了，压力大啊，先赚不算赚，笑到最后才是赢家，各种会都不参加也不发言了，写篇小文送给大家。</Paragraph></RichTextBox>";

            var xmal = string.Format(RichTextBoxTemplate, content);
            a.Content = XamlReader.Load(xmal) as StackPanel;
            return a;
        }

        private const string RichTextBoxTemplate = @"<StackPanel xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" >{0}</StackPanel>";
    }
}
